package com.example.myggnerate.config;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.fill.Column;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * ***********************************************策略配置（数据表匹配）配置*********************************************************
 */
@Configuration
public class GenerateConfig {
    /**
     * ***********************************************数据源配置*********************************************************
     */
    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    public String getUrl() {
        return url;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    /**
     * *************************************************项目配置**********************************************************
     */
    @Value("${generator.project.isProject: false}")
    private boolean isProject;

    @Value("${generator.project.project-name: ''}")
    private String projectName;

    @Value("${generator.project.do-main-name: ''}")
    private String doMainName;

    @Value("${generator.project.response-package: 'response'}")
    private String rPackage;

    private boolean hasPower = true;

    private boolean errorThrow = true;

    public boolean isProject() {
        return isProject;
    }

    public String getProjectName() {
        return projectName;
    }

    public String getDoMainName() {
        return doMainName;
    }

    public String getrPackage() {
        return rPackage;
    }

    public boolean isHasPower() {
        return hasPower;
    }

    public boolean isErrorThrow() {
        return errorThrow;
    }

    /**
     * *************************************************全局配置**********************************************************
     */
    @Value("${generator.global-config.output-dir}")
    private String outputDir;//输出目录

    @Value("${generator.global-config.author:作者}")
    private String author;//作者

    @Value("${generator.global-config.comment-date: yyyy-MM-dd}")
    private String commentDate;//注释时间格式

    public String getOutputDir() {
        return outputDir;
    }

    public String getAuthor() {
        return author;
    }

    public String getCommentDate() {
        return commentDate;
    }

    /**
     * ***********************************************包配置*********************************************************
     */
    @Value("${generator.package-config.parent: com.mofeng}")
    private String parentPackage;//

    @Value("${generator.package-config.module-name}")
    private String moduleNamePackage;//

    @Value("${generator.package-config.entity: entity}")
    private String entityPackage;//

    @Value("${generator.package-config.mapper: mapper}")
    private String mapperPackage;//

    @Value("${generator.package-config.mapper-xml: mapper.xml}")
    private String mapperXmlPackage;//

    @Value("${generator.package-config.service: service}")
    private String servicePackage;//

    @Value("${generator.package-config.service-impl: service.impl}")
    private String serviceImplPackage;//

    @Value("${generator.package-config.controller: controller}")
    private String controllerPackage;//

    @Value("${generator.package-config.dto: dto}")
    private String dtoPackage;//

    @Value("${generator.package-config.vo: vo}")
    private String voPackage;//

    @Value("${generator.package-config.qo: qo}")
    private String qoPackage;//

    public String getParentPackage() {
        return parentPackage;
    }

    public String getModuleNamePackage() {
        return moduleNamePackage;
    }

    public String getEntityPackage() {
        return entityPackage;
    }

    public String getMapperPackage() {
        return mapperPackage;
    }

    public String getMapperXmlPackage() {
        return mapperXmlPackage;
    }

    public String getServicePackage() {
        return servicePackage;
    }

    public String getServiceImplPackage() {
        return serviceImplPackage;
    }

    public String getControllerPackage() {
        return controllerPackage;
    }

    public String getDtoPackage() {
        return dtoPackage;
    }

    public String getVoPackage() {
        return voPackage;
    }

    public String getQoPackage() {
        return qoPackage;
    }

    /**
     * ***********************************************数据表配置***********************************************
     */
    @Value("${generator.data-table-config.table-prefix: ''}")
    private String tablePrefix;//增加过滤表前缀

    @Value("${generator.data-table-config.table-suffix: ''}")
    private String tableSuffix;//增加过滤表后缀

    public String[] getTablePrefix() {
        return getArrFromStr(this.tablePrefix);
    }

    public String[] getTableSuffix() {
        return getArrFromStr(this.tableSuffix);
    }

    /**
     * ***********************************************实体类设置***********************************************
     */
    @Value("${generator.entity-config.super-class-name}")
    private String superClassName;//设置乐观锁字段名为

    @Value("${generator.entity-config.version-column-name}")
    private String versionColumnName;//设置乐观锁字段名为

    @Value("${generator.entity-config.version-property-name}")
    private String versionPropertyName;//设置乐观锁属性名

    @Value("${generator.entity-config.logic-delete-columnName}")
    private String logicDeleteColumnName;//设置逻辑删除字段名为

    @Value("${generator.entity-config.logic-delete-propertyName}")
    private String logicDeletePropertyName;//设置逻辑删除属性名

    @Value("${generator.entity-config.super-entity-columns}")
    private String superEntityColumns;//添加父类中的公共字段

    @Value("${generator.entity-config.table-fills}")
    private String tableFills;//表填充字段 格式字段名&填充方式(default, insert, update, insert_update),字段名&填充方式

    @Value("${generator.entity-config.id-type}")
    private String idType;//主键自增类型 AUTO,NONE,INPUT,ASSIGN_ID,ASSIGN_UUID

    public String getEntitySuperClassName() {
        return superClassName + "Entity";
    }

    public Column[] getTableFills() {
        if (this.tableFills == null || this.tableFills.isEmpty()) {
            return new Column[0];
        }
        List<Column> columns = new ArrayList<>();
        String[] columnItem = this.tableFills.split(",");
        String key = "&";
        for (String columnStr : columnItem) {
            if (!columnStr.contains(key)) {
                throw new RuntimeException("请按照格式填写填充方式，举例 create_time&insert,update_time&insert_update");
            }
            String[] split = columnStr.split(key);
            columns.add(new Column(split[0], getFieldFill(split[1])));
        }


        return columns.toArray(new Column[]{});
    }

    private FieldFill getFieldFill(String fieldFillType) {
        fieldFillType = fieldFillType.toLowerCase();
        return switch (fieldFillType) {
            case "insert" -> FieldFill.INSERT;
            case "insert_update" -> FieldFill.INSERT_UPDATE;
            case "update" -> FieldFill.UPDATE;
            default -> FieldFill.DEFAULT;
        };
    }

    public String getVersionColumnName() {
        return versionColumnName;
    }

    public String getVersionPropertyName() {
        return versionPropertyName;
    }

    public String getLogicDeleteColumnName() {
        return logicDeleteColumnName;
    }

    public String getLogicDeletePropertyName() {
        return logicDeletePropertyName;
    }

    public String[] getSuperEntityColumns() {
        return getArrFromStr(this.superEntityColumns);
    }

    public IdType getIdType() {
        String type = this.idType.toLowerCase();
        return switch (type) {
            case "none" -> IdType.NONE;
            case "input" -> IdType.INPUT;
            case "assign_id" -> IdType.ASSIGN_ID;
            case "assign_uuid" -> IdType.ASSIGN_UUID;
            default -> IdType.AUTO;
        };
    }

    /**
     * ***********************************************Service设置***********************************************
     */
    @Value("${generator.service-config.super-can}")
    private boolean canSuper;//是否继承mybatis-plus的公共service父类

    public boolean isCanSuper() {
        return canSuper;
    }

    /**
     * ********************************文件名格式化 设置生成文件名的格式，"%s"会被替换为实体类名******************************
     */
    @Value("${generator.file-name-config.entity-format}")
    private String entityFormat;//实体名称格式化

    @Value("${generator.file-name-config.controller-format}")
    private String controllerFormat;//controller名称格式化

    @Value("${generator.file-name-config.service-format}")
    private String serviceFormat;//service名称格式化


    @Value("${generator.file-name-config.service-impl-format}")
    private String serviceImplFormat;//serviceImpl名称格式化


    @Value("${generator.file-name-config.mapper-format}")
    private String mapperFormat;//mapper名称格式化


    @Value("${generator.file-name-config.mapper-xml-format}")
    private String mapperXmlFormat;//mapperXml名称格式化


    @Value("${generator.file-name-config.dto-format}")
    private String dtoFormat;//dto称格式化


    @Value("${generator.file-name-config.vo-format}")
    private String voFormat;//Vo名称格式化


    @Value("${generator.file-name-config.qo-format}")
    private String qoFormat;//搜索类名称格式化

    public String getEntityFormat() {
        return entityFormat;
    }

    public String getControllerFormat() {
        return controllerFormat;
    }

    public String getServiceFormat() {
        return serviceFormat;
    }

    public String getServiceImplFormat() {
        return serviceImplFormat;
    }

    public String getMapperFormat() {
        return mapperFormat;
    }

    public String getMapperXmlFormat() {
        return mapperXmlFormat;
    }

    public String getDtoFormat() {
        return dtoFormat.replace("%s", "") + ".java";
    }

    public String getVoFormat() {
        return voFormat.replace("%s", "") + ".java";
    }

    public String getQoFormat() {
        return qoFormat.replace("%s", "") + ".java";
    }

    public String getDtoSuperClassName() {
        return superClassName + "Dto";
    }

    public String getVoSuperClassName() {
        return superClassName + "Vo";
    }

    public String getQoSuperClassName() {
        return superClassName + "Qo";
    }

    private String[] getArrFromStr(String tableSuffix) {
        return getArrFromStr(tableSuffix, ",");
    }

    private String[] getArrFromStr(String tableSuffix, String charSequence) {
        String[] result;
        if (tableSuffix.contains(charSequence)) {
            result = tableSuffix.split(charSequence);
        } else {
            result = new String[]{tableSuffix};
        }
        return result;
    }

//    /**
//     * 数据源配置
//     */
//    public class DataBaseConfig {
//        @Value("${spring.datasource.url}")
//        private String URL;
//
//        @Value("${spring.datasource.username}")
//        private String USER_NAME;
//
//        @Value("${spring.datasource.password}")
//        private String PASS_WORD;
//    }
//
//    /**
//     * 项目配置
//     */
//    public class ProjectConfig {
//
//        @Value("${generator.project.isProject: false}")
//        private boolean IS_PROJECT;
//
//        @Value("${generator.project.project-name: ''}")
//        private String PROJECT_NAME;
//
//        @Value("${generator.project.do-main-name: ''}")
//        private String DO_MAIN_NAME;
//    }
//
//    /**
//     * 全局配置
//     */
//    public class GlobalConfig {
//        @Value("${generator.global-config.output-dir}")
//        private String OUTPUT_DIR;//输出目录
//
//        @Value("${generator.global-config.author:作者}")
//        private String AUTHOR;//作者
//
//        @Value("${generator.global-config.comment-date: yyyy-MM-dd}")
//        private String COMMENT_DATE;//注释时间格式
//    }
//
//    /**
//     * 包配置
//     */
//    public class PackageConfig {
//        @Value("${generator.package-config.parent: com.mofeng}")
//        private String PARENT_PACKAGE;//
//
//        @Value("${generator.package-config.module-name}")
//        private String MODULE_NAME_PACKAGE;//
//
//        @Value("${generator.package-config.entity: entity}")
//        private String ENTITY_PACKAGE;//
//
//        @Value("${generator.package-config.mapper: mapper}")
//        private String MAPPER_PACKAGE;//
//
//        @Value("${generator.package-config.mapper-xml: mapper.xml}")
//        private String MAPPER_XML_PACKAGE;//
//
//        @Value("${generator.package-config.service: service}")
//        private String SERVICE_PACKAGE;//
//
//        @Value("${generator.package-config.service-impl: service.impl}")
//        private String SERVICE_IMPL_PACKAGE;//
//
//        @Value("${generator.package-config.controller: controller}")
//        private String CONTROLLER_PACKAGE;//
//
//        @Value("${generator.package-config.dto: dto}")
//        private String DTO_PACKAGE;//
//
//        @Value("${generator.package-config.vo: vo}")
//        private String VO_PACKAGE;//
//
//        @Value("${generator.package-config.qo: qo}")
//        private String QO_PACKAGE;//
//    }
//
//    /**
//     * 数据表配置
//     */
//    public class TableConfig {
//
//        @Value("${generator.data-table-config.table-prefix: ''}")
//        private String TABLE_PREFIX;//增加过滤表前缀
//
//        @Value("${generator.data-table-config.table-suffix: ''}")
//        private String TABLE_SUFFIX;//增加过滤表后缀
//
//    }
//
//    /**
//     * 实体类设置
//     */
//    public class EntityConfig {
//        @Value("${generator.entity-config.version-column-name}")
//        private String versionColumnName;//设置乐观锁字段名为
//
//        @Value("${generator.entity-config.version-property-name}")
//        private String versionPropertyName;//设置乐观锁属性名
//
//        @Value("${generator.entity-config.logic-delete-columnName}")
//        private String logicDeleteColumnName;//设置逻辑删除字段名为
//
//        @Value("${generator.entity-config.logic-delete-propertyName}")
//        private String logicDeletePropertyName;//设置逻辑删除属性名
//
//        @Value("${generator.entity-config.super-entity-columns}")
//        private String superEntityColumns;//添加父类中的公共字段
//
//        @Value("${generator.entity-config.table-fills}")
//        private String tableFills;//表填充字段 格式字段名&填充方式(default, insert, update, insert_update),字段名&填充方式
//
//        @Value("${generator.entity-config.id-type}")
//        private String idType;//主键自增类型 AUTO,NONE,INPUT,ASSIGN_ID,ASSIGN_UUID
//
//        public String getVersionColumnName() {
//            return versionColumnName;
//        }
//
//        public void setVersionColumnName(String versionColumnName) {
//            this.versionColumnName = versionColumnName;
//        }
//
//        public String getVersionPropertyName() {
//            return versionPropertyName;
//        }
//
//        public void setVersionPropertyName(String versionPropertyName) {
//            this.versionPropertyName = versionPropertyName;
//        }
//
//        public String getLogicDeleteColumnName() {
//            return logicDeleteColumnName;
//        }
//
//        public void setLogicDeleteColumnName(String logicDeleteColumnName) {
//            this.logicDeleteColumnName = logicDeleteColumnName;
//        }
//
//        public String getLogicDeletePropertyName() {
//            return logicDeletePropertyName;
//        }
//
//        public void setLogicDeletePropertyName(String logicDeletePropertyName) {
//            this.logicDeletePropertyName = logicDeletePropertyName;
//        }
//
//        public String getSuperEntityColumns() {
//            return superEntityColumns;
//        }
//
//        public void setSuperEntityColumns(String superEntityColumns) {
//            this.superEntityColumns = superEntityColumns;
//        }
//
//        public Column[] getTableFills() {
//            if (this.tableFills == null || "".equals(this.tableFills)) {
//                return new Column[0];
//            }
//            List<Column> columns = new ArrayList<>();
//            String[] columnItem = this.tableFills.split(",");
//            String key = "&";
//            for (String columnStr : columnItem) {
//                if (columnStr.contains(key)) {
//                    throw new RuntimeException("请按照格式填写填充方式，举例 create_time&insert,update_time&insert_update");
//                }
//                String[] split = columnStr.split(key);
//                columns.add(new Column(split[0], getFieldFill(split[0])));
//            }
//
//
//            return columns.toArray(new Column[]{});
//        }
//
//        private FieldFill getFieldFill(String fieldFillType) {
//            FieldFill result = FieldFill.DEFAULT;
//            fieldFillType = fieldFillType.toLowerCase();
//            switch (fieldFillType) {
//                case "insert":
//                    result = FieldFill.INSERT;
//                    break;
//                case "insert_update":
//                    result = FieldFill.INSERT_UPDATE;
//                    break;
//                case "update":
//                    result = FieldFill.UPDATE;
//                    break;
//            }
//            return result;
//        }
//
//        public void setTableFills(String tableFills) {
//            this.tableFills = tableFills;
//        }
//
//        public String getIdType() {
//            return idType;
//        }
//
//        public void setIdType(String idType) {
//            this.idType = idType;
//        }
//    }
//
//    /**
//     * 文件名格式化 设置生成文件名的格式，"%s"会被替换为实体类名
//     */
//    public class FileNameConfig {
//        @Value("${generator.file-name-config.entity-format}")
//        private String entityFormat;//实体名称格式化
//
//        @Value("${generator.file-name-config.controller-format}")
//        private String controllerFormat;//controller名称格式化
//
//        @Value("${generator.file-name-config.service-format}")
//        private String serviceFormat;//service名称格式化
//
//
//        @Value("${generator.file-name-config.service-impl-format}")
//        private String serviceImplFormat;//serviceImpl名称格式化
//
//
//        @Value("${generator.file-name-config.mapper-format}")
//        private String mapperFormat;//mapper名称格式化
//
//
//        @Value("${generator.file-name-config.mapper-xml-format}")
//        private String mapperXmlFormat;//mapperXml名称格式化
//
//
//        @Value("${generator.file-name-config.dto-format}")
//        private String dtoFormat;//dto称格式化
//
//
//        @Value("${generator.file-name-config.vo-format}")
//        private String voFormat;//Vo名称格式化
//
//
//        @Value("${generator.file-name-config.qo-format}")
//        private String qoFormat;//搜索类名称格式化
//    }
}
